using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Curriculum.Metadatos.ClasesMetadatos;
using Curriculum.Modelo.Clases;
using Curriculum.Services;
using Actualizacion;
using Curriculum.DataAccess.Server;
using Curriculum.Db4oHttpModule;
using Curriculum.LectoresXML.LectorMetadatos;
using Curriculum.LectoresXML.LectorDatos;
using Curriculum.Manejadores;
using Curriculum.Modelo.Enum;
using Curriculum.Utiles;
using Utiles;
using Antecedente = Curriculum.LectoresXML.LectorDatos.Antecedente;
using Atributo = Curriculum.LectoresXML.LectorMetadatos.Atributo;
using Docente = Curriculum.Modelo.Clases.Docente;
using Mod = Curriculum.Modelo.Clases;
using System.IO;

namespace Concurso
{
	/// <summary>
	/// Summary description for TestPage.
	/// </summary>
	public class TestPage : System.Web.UI.Page
	{
		private void Page_Load(object sender, System.EventArgs e)
		{
			AtributosDbToXML();
//			ListaItemsTipoValorDbToXML();
//			EliminarJurado();
//			EsctructuraDbToXML();
//			CrearDocente();
//			CrearUsuario();
//			ObtenerAntecedenteMetadado();
//			BorrarAtributosNulos();
//			ObtenerAntecedenteMetadado();
//			BorrarAtributosRepetidos();
//			ObtenerAtributosMetadatos();
//			ObtenerAntecedente();
//			ObtenerVersion();
//			RetrocederEstado();
			//			ProbarCreacionAntecedenteMetadato();
			//ProbarModificacionAntecedenteMetadato();

//			ProbarGetJuradoEntreMuchos();

//			ProbarCreacionAtributoMetadato();

//			VersionMetadatosService service = new VersionMetadatosService();
//			service.CrearAntecedenteMetadato(null);


//			// Prueba de ObtenerNodosHijo
//			VersionMetadatosService service = new VersionMetadatosService();
//			IList listaHijos = service.ObtenerNodosHijo("15");
			

//			// Escribir Metadatos en Base desde el Archivo XML
//			CargarMetadatosDeXMLaBase();


//			// Cargo Atributos en la base desde el xml
//			CargarAtributosDeXMLaBase();

			// Elimino un LookupType
//			LookupTypeService svc = new LookupTypeService();
//			svc.EliminarLookupType("5");


//			ActualizadorCV actualizador = new ActualizadorCV();
//			actualizador.Ejecutar();


//			// Eliminar Objetos
//			EliminarObjetosDeLaBase();


//			// PRUEBA GetConcursosByJuradoId -> quedo hecho con SODA (asi pega menos kuak!!)
//			// Borrar o Renombrar la base para que funcione
//			ProbarGetConcursoByDocenteIdSODA();

		}
		
		private void AtributosDbToXML()
		{
			IList lista = GetObjectServer().GetAllObjects(typeof(AtributoMetadato));
			ManejadorAtributosMetadatos manejador = new ManejadorAtributosMetadatos();

			ArrayList listaAtributos = new ArrayList();
			ListaAtributos listaAtributosXML = new ListaAtributos();
			
			foreach (AtributoMetadato atriMeta in lista)
			{
				Atributo atributo = new Atributo();
				atributo.idAtributo = atriMeta.Id;
				atributo.longitud = atriMeta.Longitud;
				atributo.nombre = atriMeta.Nombre;
				atributo.opcional = atriMeta.Opcional;
				atributo.tipo = atriMeta.IdTipoDato;
				listaAtributos.Add(atributo);
			}

			listaAtributosXML.Atributos = new Atributo[listaAtributos.Count];
			listaAtributos.CopyTo(listaAtributosXML.Atributos);
			
			manejador.GuardarListaAtrubutosEnXML(listaAtributosXML);
		}
		private void ListaItemsTipoValorDbToXML()
		{	
			IList lista = GetObjectServer().GetAllObjects(typeof(ItemListaValores));
			ManejadorListasValores manejador = new ManejadorListasValores();

			Valores valoresXML = new Valores();
			ArrayList listaValores = new ArrayList();
			foreach (ItemListaValores valor in lista)
			{
				ItemValor itemValorXML = new ItemValor();
				itemValorXML.id = valor.Id;
				itemValorXML.idAntecedente = valor.AntecedenteMetadato.Id;
				itemValorXML.idAtributo = valor.AtributoMetadato.Id;
				itemValorXML.valor = valor.Valor;

				listaValores.Add(itemValorXML);
			}
			
			valoresXML.ItemValor = new ItemValor[listaValores.Count];
			listaValores.CopyTo(valoresXML.ItemValor);
			manejador.GuardarListaValoresEnXML(valoresXML);			
		}
		
		private void EliminarJurado()
		{

			GetObjectServer().DeleteAllObjects(typeof(Jurado));
			Usuario usuario =GetObjectServer().GetUsuario("Jurado","");
			GetObjectServer().DeleteObjejct(usuario);
		}

		private void EsctructuraDbToXML()
		{
			AntecedenteMetadato anteMetaRaiz = GetObjectServer().GetAntecedentesMetadatoHuerfanos()[0] as AntecedenteMetadato;
			ManejadorAntecedentesMetadatos manejador = ManejadorAntecedentesMetadatos.GetInstancia("");
			manejador.Estructura = anteMetaRaiz;
			manejador.GuardarEstructuraEnXML();
		}

		private void CrearDocente()
		{			
			GetObjectServer().DeleteAllObjects(typeof(Usuario));
			GetObjectServer().DeleteAllObjects(typeof(Docente));

			Usuario usuario = new Usuario();			
			usuario.Id = IdGenerator.GetNextId(typeof(Usuario), GetObjectServer().Container);
			usuario.Username = "docente";
			usuario.Password = "123";
			
			Rol rol = new Docente();
			rol.Id = IdGenerator.GetNextId(typeof(Docente), GetObjectServer().Container);
			GetObjectServer().SetObjejct(rol);

			usuario.Rol = rol;
			GetObjectServer().SetObjejct(usuario);
		}

		private void CrearUsuario()
		{			
			GetObjectServer().DeleteAllObjects(typeof(Usuario));
			GetObjectServer().DeleteAllObjects(typeof(Administrador));

			Usuario usuario = new Usuario();			
			usuario.Id = IdGenerator.GetNextId(typeof(Usuario), GetObjectServer().Container);
			usuario.Username = "usuario";
			usuario.Password = "123";
			
			Rol rol = new Administrador();			
			rol.Apellido = "Admin";
			rol.Nombre = "Admin";
			rol.Id = IdGenerator.GetNextId(typeof(Administrador), GetObjectServer().Container);
			GetObjectServer().SetObjejct(rol);

			usuario.Rol = rol;
			GetObjectServer().SetObjejct(usuario);
		}

		private void BorrarAtributosNulos()
		{
			IList atributos = GetObjectServer().GetAllAtributos();
			foreach (AtributoMetadato am in atributos)
			{
				if (am == null)
				{
					GetObjectServer().DeleteObjejct(am);
				}
			}

		}

		private void ObtenerAntecedenteMetadado()
		{
			string id = "3";
			AntecedenteMetadato anteMeta = GetObjectServer().GetAntecedenteMetadato(id);
			AtributoMetadato atr = new AtributoMetadato();
				
			atr = new AtributoMetadato();
			atr.Nombre = "localizacino Institucion";
			atr.IdTipoDato = "1";
			atr.Longitud = 3;
			atr.Opcional = true;
			atr.Id = "51";

			anteMeta.AtributoMetadatos.SetValue(atr,3);
			GetObjectServer().SetObjejct(anteMeta);

		}
		private void BorrarAtributosRepetidos()
		{
			// se obtienen ordenados
			ArrayList atributosMeta = ObtenerAtributosMetadatos();
			IObjetoId corr;
			IObjetoId sig;
			for (int idx = 0; idx < atributosMeta.Count-1; idx++)
			{
				corr = ((AtributoMetadato)(atributosMeta[idx]));
				sig = ((AtributoMetadato)(atributosMeta[idx+1]));
				if (corr.Id == sig.Id)
				{
					GetObjectServer().DeleteObjejct(corr);
				}
			}
			
		}

		private ArrayList ObtenerAtributosMetadatos()
		{			
			ObjectServer dataManager = GetObjectServer();
			IList lista = dataManager.GetAllAtributos();
			ArrayList array = new ArrayList();
			foreach (AtributoMetadato att in lista)
			{
				array.Add(att);
			}
			array.Sort(new GenericComparer("Id", true));
			StringBuilder sb = new StringBuilder();
			foreach (AtributoMetadato att in array)
			{
				sb.Append(att.Id);
				sb.Append(" - ");
			}
			string result = sb.ToString();

			return array;
		}

		private void ObtenerAntecedente()
		{
			string id = "8";
			ObjectServer dataManager = GetObjectServer();
			Mod.Antecedente ante = dataManager.GetById(typeof(Mod.Antecedente), id) as Mod.Antecedente;
		}

		private void ObtenerVersion()
		{
			ObjectServer dataManager = GetObjectServer();
			Mod.VersionCurriculo version = dataManager.GetVersionByDocenteId("1");
		}

		private void RetrocederEstado()
		{
			ObjectServer dataManager = GetObjectServer();
			Mod.Concurso concurso = dataManager.GetById(typeof(Mod.Concurso), "7") as Mod.Concurso;

			concurso.Estado = EstadoConcurso.ABIERTOAINSCRIPCION;
			dataManager.SetObjejct(concurso);
		}

		private void ProbarCreacionAtributoMetadato()
		{
			VersionMetadatosService service = new VersionMetadatosService();
			AtributoMetadato att = new AtributoMetadato();	
			att.IdTipoDato = "3";
			att.Longitud = 5;
			att.Nombre = "Nuevo Atributo Desde el Test 2";
			att.Opcional = true;
			service.CrearAtributoMetadato(att);
		}

		private void ProbarCreacionAntecedenteMetadato()
		{
			VersionMetadatosService service = new VersionMetadatosService();
			AntecedenteMetadato anteMeta = new AntecedenteMetadato();
			//anteMeta.IdPadre = "15";
			anteMeta.Nombre = "Antecedente Metadato De Prueba";
			anteMeta.EsAgregacion = true;
	
			AtributoMetadato at1 = new AtributoMetadato();
			AtributoMetadato at2 = new AtributoMetadato();
			AtributoMetadato at3 = new AtributoMetadato();
			at1.Id = "4";
			at2.Id = "5";
			at3.Id = "6";
			AtributoMetadato[] atributos = new AtributoMetadato[]{at1, at2, at3};
			// CREARLE ATRIBUTOS PARA PROBAR MEJOR !!!
			anteMeta.AtributoMetadatos = atributos;
			anteMeta.NroVersion = "0";
	
			service.CrearAntecedenteMetadato(anteMeta);
		}

		private void ProbarModificacionAntecedenteMetadato()
		{
			VersionMetadatosService service = new VersionMetadatosService();			
			
			AntecedenteMetadato anteMeta = new AntecedenteMetadato();
			anteMeta.Id = "1";
			anteMeta.Nombre = "Antecedete de Prueba de Modificacion";
				
			AtributoMetadato at1 = new AtributoMetadato();
			AtributoMetadato at2 = new AtributoMetadato();
			AtributoMetadato at3 = new AtributoMetadato();
			at1.Id = "1";
			at2.Id = "2";
			at3.Id = "3";

			AtributoMetadato[] atributos = new AtributoMetadato[]{at1, at2, at3};
			// CREARLE ATRIBUTOS PARA PROBAR MEJOR !!!
			anteMeta.AtributoMetadatos = atributos;
			anteMeta.NroVersion = "0";
	
			service.ModificarAntecedenteMetadato(anteMeta);

		}
		private void ProbarGetConcursoByDocenteIdSODA()
		{
			ListaJurado jurados = new ListaJurado();
			jurados.Add(CrearJurado("1"));
	
			// creo un concurso con solo un jurado (el de id 1)
			Mod.Concurso concurso1 = CrearConcurso("8", jurados);
	
			jurados.Add(CrearJurado("2"));
			Mod.Concurso concurso2 = CrearConcurso("9", jurados);

			ObjectServer dataManager = GetObjectServer();
			dataManager.SetObjejct(concurso1);
			dataManager.SetObjejct(concurso2);
	
			// tiene q encontrar 2 jurados
			IList juradosEncontrados = dataManager.GetJurados(string.Empty, string.Empty, string.Empty);
	
			if (juradosEncontrados.Count != 2)
			{
				throw new Exception("juradosEncontrados: tiene que tener 2 jurados");
			}
	
			// tiene que traer 2 concursos
			IList concursosEncontrados1 = dataManager.GetConcursosByJuradoId("1");
			if (concursosEncontrados1.Count != 2)
			{
				throw new Exception("concursosEncontrados1: tiene que traer 2 concursos");
			}
	
			// tiene que traer 1 concurso
			IList concursosEncontrados2 = dataManager.GetConcursosByJuradoId("2");
			if (concursosEncontrados2.Count != 1)
			{
				throw new Exception("concursosEncontrados2: tiene que traer 1 concurso");
			}
	
			// no tiene que traer concursos
			IList concursosEncontrados3 = dataManager.GetConcursosByJuradoId("3");
			if (concursosEncontrados3.Count != 0)
			{
				throw new Exception("concursosEncontrados3: no tiene que traer concursos");
			}
		}

		private void ProbarGetJuradoEntreMuchos()
		{
			Usuario usr;
			ObjectServer dataManager = GetObjectServer();
			for (int idUsr = 1; idUsr<20; idUsr++)
			{
				usr = new Usuario();
				usr.Id = idUsr.ToString();
				// como nombre les pongo fechas
				usr.Username = DateTime.Today.AddDays(idUsr-1).ToShortDateString();
				usr.Password = "xzxz";
				dataManager.SetObjejct(usr);
			}


//			Usuario usuarioBuscado = dataManager.GetUsuarioPorNombre(DateTime.Today.ToShortDateString());
		}
		private void CargarMetadatosDeXMLaBase()
		{
			VersionMetadato versionMeta = new VersionMetadato();
			versionMeta.Id = "1";
			versionMeta.Estructura = ManejadorAntecedentesMetadatos.GetInstancia("").Estructura;
	
			ObjectServer dataManager = new ObjectServer(Db4oHttpModule.Client);
			dataManager.SetObjejct(versionMeta);
		}

		private void CargarAtributosDeXMLaBase()
		{
			ManejadorAtributosMetadatos manejador = new ManejadorAtributosMetadatos();			
	
			ObjectServer dataManager = new ObjectServer(Db4oHttpModule.Client);
			dataManager.SetObjejct(manejador.GetAll());
		}

		private void EliminarObjetosDeLaBase()
		{
			ObjectServer dataManager = new ObjectServer(Db4oHttpModule.Client);
//			dataManager.GetAllObjects(typeof(VersionCurriculo));
	
			dataManager.DeleteAllObjects(typeof(object));
			dataManager.DeleteAllObjects(typeof(AtributoMetadato));
			dataManager.DeleteAllObjects(typeof(VersionMetadato));
			dataManager.DeleteAllObjects(typeof(VersionCurriculo));
			dataManager.DeleteAllObjects(typeof(Antecedente));
//			dataManager.DeleteAllObjects(typeof(ListaAntecedentes));
//			dataManager.DeleteAllObjects(typeof(ListaAtributos));
			dataManager.DeleteAllObjects(typeof(Atributo));
			dataManager.DeleteAllObjects(typeof(Docente));
	
			dataManager.Container.Close();
		}


		private Mod.Concurso CrearConcurso(string idConcurso, IList jurados)
		{
			Mod.Concurso concurso = new Mod.Concurso();

			concurso.Id = idConcurso;
	
			concurso.Nombre = "Concurso de prueba de metodo SODA";			
			concurso.Resolucion = "Resolusion del concurso";			
			concurso.Descripcion = "Descripcion del concurso SODA";
			concurso.Estado = EstadoConcurso.CREADO;
	
//			concurso.Area;
//			concurso.Departamento;
//			concurso.Fecha;
//			concurso.Postulantes;
	
			concurso.JuradosEnConcurso = new ListaJuradoEnConcurso();

			ListaJuradoEnConcurso juradosDelConcurso = new ListaJuradoEnConcurso();
			JuradoEnConcurso juradoEnConcurso;
			foreach (Jurado jurado in jurados)
			{
				juradoEnConcurso  = new JuradoEnConcurso();
				juradoEnConcurso.Jurado = jurado;
				juradoEnConcurso.Id = new Random(50).Next().ToString();
				juradoEnConcurso.EsTitular = true;
				juradoEnConcurso.Concurso = concurso;

				juradosDelConcurso.Add(juradoEnConcurso);
			}			
			
			concurso.JuradosEnConcurso = juradosDelConcurso;

			return concurso;
		}

		private Jurado CrearJurado(string juradoId)
		{
			Jurado jurado = new Jurado();
			jurado.Apellido = "Unzaga";
			jurado.Nombre = "Remuppet";
			jurado.Id = juradoId;
			jurado.Observaciones = "Malisimo";
			jurado.Domicilio = "y Esto?";
//			jurado.EsInterno = true;

			//jurado.Institucion;
			//jurado.Cargo;

			return jurado;
		}

		private ObjectServer GetObjectServer()
		{
			return new ObjectServer(Db4oHttpModule.Client);
		}


		#region Web Form Designer generated code
		override protected void OnInit(EventArgs e)
		{
			//
			// CODEGEN: This call is required by the ASP.NET Web Form Designer.
			//
			InitializeComponent();
			base.OnInit(e);
		}
		
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{    
			this.Load += new System.EventHandler(this.Page_Load);

		}
		#endregion
	}
}
